import express, { Request, Response, Router } from 'express';
import * as bcrypt from 'bcrypt';
import { PrismaClient } from '@prisma/client';
import { ApiResponse } from '../utils/response';
import { authMiddleware } from '../middleware/auth';

const router: Router = express.Router();
const prisma = new PrismaClient();

// 获取当前用户信息
router.get('/info', authMiddleware, async (req: Request, res: Response): Promise<void> => {
  try {
    const userId = (req as any).userId;

    const user = await prisma.user.findUnique({
      where: { id: userId },
      select: {
        id: true,
        idNumber: true,
        username: true,
        name: true,
        birthDateFirst6: true,
        withdrawalBank: true,
        withdrawalAccount: true,
        accountHolder: true,
        mobileCarrier: true,
        mobileNumber: true,
        entryCode: true,
        status: true,
        tier: true,
        createdAt: true,
        updatedAt: true
      }
    });

    if (!user) {
      res.status(404).json(ApiResponse.error('사용자를 찾을 수 없습니다.'));
      return;
    }

    res.json(ApiResponse.success(user, '사용자 정보 조회에 성공했습니다.'));
  } catch (error) {
    console.error('사용자 정보 조회 오류:', error);
    res.status(500).json(ApiResponse.error('사용자 정보 조회에 실패했습니다.'));
  }
});

// 修改用户信息（支持分字段修改）
router.put('/update', authMiddleware, async (req: Request, res: Response): Promise<void> => {
  try {
    const userId = (req as any).userId;
    const {
      // 基础信息
      name,
      birthDateFirst6,
      // 密码修改
      oldPassword,
      newPassword,
      // 银行账户
      withdrawalBank,
      withdrawalAccount,
      accountHolder,
      // 联系方式
      mobileCarrier,
      mobileNumber
    } = req.body;

    // 验证至少提供一个要修改的字段
    if (!name && !birthDateFirst6 && !newPassword && !withdrawalBank && !withdrawalAccount && !accountHolder && !mobileCarrier && !mobileNumber) {
      res.status(400).json(ApiResponse.error('수정할 정보를 입력해 주세요.'));
      return;
    }

    // 获取用户当前信息
    const user = await prisma.user.findUnique({
      where: { id: userId }
    });

    if (!user) {
      res.status(404).json(ApiResponse.error('사용자를 찾을 수 없습니다.'));
      return;
    }

    // 构建更新数据
    const updateData: any = {};

    // 修改密码需要验证旧密码
    if (newPassword) {
      if (!oldPassword) {
        res.status(400).json(ApiResponse.error('현재 비밀번호를 입력해 주세요.'));
        return;
      }

      // 验证旧密码
      const isPasswordValid = await bcrypt.compare(oldPassword, user.password);
      if (!isPasswordValid) {
        res.status(400).json(ApiResponse.error('현재 비밀번호가 올바르지 않습니다.'));
        return;
      }

      // 验证新密码长度
      if (newPassword.length < 6) {
        res.status(400).json(ApiResponse.error('비밀번호는 최소 6자 이상이어야 합니다.'));
        return;
      }

      updateData.password = await bcrypt.hash(newPassword, 12);
    }

    // 基础信息
    if (name) {
      updateData.name = name;
    }

    if (birthDateFirst6) {
      // 验证格式 (6位数字)
      if (!/^\d{6}$/.test(birthDateFirst6)) {
        res.status(400).json(ApiResponse.error('생년월일은 6자리 숫자여야 합니다 (예: 901225).'));
        return;
      }
      updateData.birthDateFirst6 = birthDateFirst6;
    }

    // 银行账户信息（需要同时提供三个字段或都不提供）
    const hasBankInfo = withdrawalBank || withdrawalAccount || accountHolder;
    if (hasBankInfo) {
      if (!withdrawalBank || !withdrawalAccount || !accountHolder) {
        res.status(400).json(ApiResponse.error('은행, 계좌번호, 예금주를 모두 입력해 주세요.'));
        return;
      }
      updateData.withdrawalBank = withdrawalBank;
      updateData.withdrawalAccount = withdrawalAccount;
      updateData.accountHolder = accountHolder;
    }

    // 联系方式（需要同时提供两个字段或都不提供）
    const hasMobileInfo = mobileCarrier || mobileNumber;
    if (hasMobileInfo) {
      if (!mobileCarrier || !mobileNumber) {
        res.status(400).json(ApiResponse.error('통신사와 휴대폰 번호를 모두 입력해 주세요.'));
        return;
      }
      updateData.mobileCarrier = mobileCarrier;
      updateData.mobileNumber = mobileNumber;
    }

    // 执行更新
    const updatedUser = await prisma.user.update({
      where: { id: userId },
      data: updateData,
      select: {
        id: true,
        name: true,
        birthDateFirst6: true,
        withdrawalBank: true,
        withdrawalAccount: true,
        accountHolder: true,
        mobileCarrier: true,
        mobileNumber: true,
        updatedAt: true
      }
    });

    res.json(ApiResponse.success(updatedUser, '사용자 정보가 성공적으로 업데이트되었습니다.'));

  } catch (error: any) {
    console.error('사용자 정보 업데이트 오류:', error);
    if (error.code === 'P2025') {
      res.status(404).json(ApiResponse.error('사용자를 찾을 수 없습니다.'));
    } else {
      res.status(500).json(ApiResponse.error('사용자 정보 업데이트에 실패했습니다.'));
    }
  }
});

export default router;
